<?php
// 定义常量DIR_SEP，即DIRECTORY_SEPARATOR的简写
if (!defined('DIR_SEP')) {
  define('DIR_SEP', DIRECTORY_SEPARATOR);
}

/**
 * 抛出异常
 * 
 * @param string $err_msg 错误消息
 * @param int $err_code 错误代码
 *
 * @return void
 */
if (!function_exists('error')) {
  function error($err_msg, $err_code = 0)
  {
    throw new Exception($err_msg, $err_code);
  }
}

/**
 * 取得语言文件中某个变量的值
 * 
 * @param string $name 索引名称
 * @param array  $params 参数
 *
 * @return string
 */
if (!function_exists('i18n')) {
  function i18n($name, $params = null)
  {
    return (!$params) ? I18n::get($name) : vsprintf(I18n::get($name), $params);
  }
}

/**
 * 获取View模板文件编译后的路径(用于视图渲染)
 * 
 * @param string $tempalte 模板文件名
 *
 * @return string
 */
if (!function_exists('view')) {
  function view($template)
  {
    return View::getInstance()->render($template);
  }
}

/**
 * 获取环境
 * 
 * @return string
 */
if (!function_exists('environ')) {
  function environ()
  {
      return Yaf_Application::app()->environ();
  }
}

/**
 * 将路径修正为适合当前操作系统的格式 
 * 
 * @param string $path 路径
 *
 * @return string 
 */
if (!function_exists('trim_path')) {
  function trim_path($path)
  {
    return str_replace(array('/', '\\', '//', '\\\\'), DIR_SEP, $path);
  }
}

/**
 * 递归创建文件目录 
 *
 * @param string $dir 目录路径
 * @param int $mode 模式
 *
 * @return boolean 
 */
if (!function_exists('mk_dir')) {
  function mk_dir($dir, $mode = 0755)
  {
    if (is_dir($dir) || @mkdir($dir, $mode)) {
      return true;
    }
    if (!mk_dir(dirname($dir), $mode)) {
      return false;
    }
    return @mkdir($dir, $mode);
  }
}

/**
 * 清空目录
 * 
 * @param string $dir 目录路径
 * 
 * @return int
 */
if (!function_exists('clean_dir')) {
  function clean_dir($dir)
  {
    if (!is_dir($dir)) {
      return true;
    }
    $files = scandir($dir);
    unset($files[0], $files[1]);
    $result = 0;
    foreach ($files as &$f) {
      $result += @unlink($dir . $f);
    }
    unset($files);
    return $result;
  }
}

/**
 * 取得客户端的IP地址
 *
 * @return string
 */
if (!function_exists('get_ip')) {
  function get_ip()
  {
    $headerData = Http_Server::$header;
    return $headerData['x-real-ip'] ?? '';
  }
}

/**
 * 计算一个字符串多少位长度
 * 
 * @param string $str 字符串
 * 
 * @return int
 */
if (!function_exists('str_len')) {
  function str_len($str)
  {
    $i = 0;
    $count = 0;
    $len = strlen($str);
    while ($i < $len) {
      $chr = ord($str[$i]);
      $count++;
      $i++;
      if ($i >= $len) break;
      if ($chr & 0x80) {
        $chr <<= 1;
        while ($chr & 0x80) {
          $i++;
          $chr <<= 1;
        }
      }
    }
    return $count;
  }
}

/**
 * 字符串截取，支持中文和其他编码
 * 
 * @param string $str 需要转换的字符串
 * @param string $length 截取长度
 * @param string $start 开始位置
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * 
 * @return string
 */
if (!function_exists('cut_str')) {
  function cut_str($str, $length, $start = 0, $charset = "utf-8", $suffix = true)
  {
    if (function_exists("mb_substr")) {
      $slice = mb_substr($str, $start, $length, $charset);
    } elseif (function_exists('iconv_substr')) {
      $slice = iconv_substr($str, $start, $length, $charset);
      if (false === $slice) {
        $slice = '';
      }
    } else {
      $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
      $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
      $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
      $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
      preg_match_all($re[$charset], $str, $match);
      $slice = join("", array_slice($match[0], $start, $length));
    }
    return $suffix ? $slice . '...' : $slice;
  }
}

/**
 * 数组分组
 * 
 * @param array $data 源数据
 * @param string $key 键
 * 
 * @return array
 */
if (!function_exists('array_group')) {
  function array_group(array $data, string $key)
  {
    $list = [];
    foreach ($data as $val) {
      $list[$val[$key]][] = $val;
    }
    return $list;
  }
}
